import 'package:flutter/material.dart';
import 'package:flutter_demo/ui/pages/status/data/share_data.dart';
import 'package:flutter_demo/ui/pages/status/data/share_data_proxy.dart';
import 'package:flutter_demo/ui/pages/status/data/share_data_proxy_notifier.dart';
import 'package:flutter_demo/ui/pages/status/provider/proxy/b2_page_widget.dart';
import 'package:flutter_demo/ui/pages/status/provider/proxy/a2_page_widget.dart';
import 'package:provider/provider.dart';

//参考文档 https://blog.csdn.net/Lastdoggod/article/details/125955791
//参考文档 https://blog.csdn.net/Lastdoggod/article/details/125963144
class ProxyProviderTestWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _ProxyProviderTestState();
}

class _ProxyProviderTestState extends State<ProxyProviderTestWidget> {
  @override
  Widget build(BuildContext context) {
    /**
     * 在实际开发过程中肯定会有多个提供者，我们虽然可以采用嵌套的方式来解决，
     * 可读性差，这个时候就需要用到我们的MultiProvider。
     */
    return MultiProvider(
      ///配置共享数据
      providers: [
        Provider<ShareData>(

            ///配置共享数据
            create: (context) {
          return ShareData(nickname: "tc ...", level: 0);
        }),
        /**
         * 互相依赖的关系模型 
         * 当我们有多个模型的时候，会有模型依赖另一个模型的情况，在这种情况下，
         * 我们可以使用ProxyProvider从另一个提供者获取值，然后将其注入到另外一个提供者中。
         */
        ProxyProvider<ShareData, ShareDataProxy>(
          update: (_, shareData, shareDataProxy) {
            return ShareDataProxy(shareData);
          },
        ),
        //和ProxyProvider原理一样,当提ShareData数据变化时，将会重构UI。
        ChangeNotifierProxyProvider<ShareData, ShareDataProxyNotifier>(
          create: (_) => ShareDataProxyNotifier(
              ShareData(nickname: "正在初始化 ...", level: 0)),
          update: (_, shareData, shareDataProxy) =>
              ShareDataProxyNotifier(shareData),
        ),

        // ListenableProxyProvider<ShareData, ShareDataProxyNotifier>(
        //   update: (_, shareData, shareDataProxy) =>
        //       shareDataProxy ?? ShareDataProxyNotifier(shareData),
        // )
      ],
      child: Column(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: [A2PageWidget(), B2PageWidget()],
      ),
    );
  }
}
